KAPITOLA 6
PRÁCE S DATY 2
V minulé kapitole jsme se seznámili s tidyverse, který kromě balíčku ggplot2 obsahuje i několik dalších balíčků velice užitečných pro práci v R. Jedním z nich je i dplyr, jenž nám zjednoduší naši dosavadní práci zejména s data frame.
dplyr nám pomůže data třídit, přeskupovat, všemožně modifikovat či nad nimi provádět různé početní a statistické operace. Pojďme si proto tyto příkazy postupně představit. Před tím si však nezapomeňte načíst do RStudia samotný balíček tidyverse (popřípadě pouze dplyr).
Naše australské tažení dplyrem začíná v Perthu, v jehož okolí nenalezneme nic jiného než poušť. Navzdory tomu ale v této kapitole nalezneme velice úrodné prostředí, ze kterého vzejde velké množství vysoce užitečných příkazů pro práci s daty. Pojďme se s nimi seznámit.
Příkaz filter() nám pomůže, jak již samotný název napovídá, při filtraci dat s cílem vytvoření nové databáze. Představte si například, že pracujeme s našimi oblíbenými Osadníky a chceme z nich vytvořit zcela nový data frame, který bude obsahovat pouze hráče do 25 let včetně, kteří nejsou registrováni v žádném klubu deskových her, a to ani v Austrálii. Jak to provést? Buďto lze oprášit naše staré znalosti z předchozích kapitol (rozpomeňme se na hranaté závorky), či se naučit pracovat s velice jednoduchým a intuitivním příkazem filter().
Jeho struktura je taková, že za pojmenováním příkazu v závorce následuje název databáze, z níž budeme data vybírat. Poté do závorky uvedeme jednotlivé podmínky, jež jsou vždy odděleny čárkou. Pro větší přehlednost je lépe tyto podmínky uvádět na samostatném řádku, jak to lze vidět u následujícího skriptu. Výslednou databázi můžeme vypsat přímo do konzole či ji vložit do nově vzniklé proměnné, v našem případě Katan2.
Katan2 <-
filter(Katan,
Věk <= 25,
Klub != "ano" )
# Jelikož máme v proměnné Klub pouze dvě varianty hodnot,
# lze napsat přímo Klub == "ne".# A tibble: 111 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
7 6 15 muž ZŠ ne nepracuje nekouří člen 0
8 3 15 žena ZŠ ne nepracuje nekouří člen 0
9 3 15 žena ZŠ ne nepracuje nekouří člen 0
10 9 15 žena ZŠ ne nepracuje nekouří nečlen 0
# ... with 101 more rows
Ačkoliv je výše uvedený příkaz velice intuitivní, mohla by nám uniknout jedna drobná maličkost. U názvů proměnných v rámci příkazů dplyr neuvádíme název databáze spojený s dolarem (tj. Katan$Věk, respektive Katan$Klub), obdobně jako v rámci příkazů ggplot2. Tato připomínka se týká všech příkazů dplyr, které si v této kapitole ukážeme.
Pamatujete si, jak bychom bez dplyru zvládli vyřešit předchozí příklad?
Katan[Katan$Věk <= 25 & Katan$Klub != "ano", ]Ačkoliv je tento typ příkazu oproti dplyru hůře čitelný, zvláště tehdy, budeme-li naše podmínky zesložiťovat, bylo by velice dobré, abychom ani na tento styl zápisu nezapomněli a nepřestali mu rozumět. Může se nám to hodit zejména tehdy, budeme-li pracovat se skripty cizích analytiků.
V příkazu filter() lze využít i další logické operátory jako je nebo (svislá čára |) či a zároveň (ampersand &). Ukažme si je na příkladu, ve kterém budeme chtít vybrat pouze ženy od 26 do 30 let včetně, které mají bakalářské nebo magisterské vzdělání.
Katan2 <-
filter(Katan,
Pohlaví == "žena",
Věk >= 26 & Věk <= 30,
Vzdělání == "Bc - VŠ" | Vzdělání == "VŠ")# A tibble: 6 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 3 26 žena VŠ ne pracuje nekouří nečlen 0
2 3 26 žena Bc - VŠ ne pracuje nekouří člen 0
3 3 26 žena VŠ ne pracuje nekouří člen 0
4 3 26 žena Bc - VŠ ne pracuje kouří nečlen 0
5 2 27 žena VŠ ne pracuje kouří nečlen 0
6 1 28 žena VŠ ne pracuje nekouří nečlen 0
Naše proměnná Vzdělání obsahuje pouze čtyři varianty hodnot. Představme si ale, že disponuje kupříkladu dvaceti různými variantami výstupu a my chceme vybrat třeba jen dvanáct z nich. V takovém případě by nebylo příliš praktické a vhodné použít příkaz ve formátu Proměnná == "hodnota" | Proměnná == "hodnota" atd., který by byl velice dlouhý a nepřehledný. Pro tento případ tu totiž máme operátor %in%. Ukažme si ho na stejném příkladu s proměnnou Vzdělání, pomocí něhož vypíšeme do konzole všechna pozorování pro bakaláře a magistry.
filter(Katan,
Vzdělání %in% c("Bc - VŠ", "VŠ"))# A tibble: 69 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 6 22 muž Bc - VŠ ne nepracuje nekouří člen 0
2 2 23 muž Bc - VŠ ne nepracuje nekouří člen 0
3 3 23 muž Bc - VŠ ne nepracuje nekouří člen 0
4 4 23 žena Bc - VŠ ano nepracuje kouří nečlen 0
5 5 23 muž Bc - VŠ ano nepracuje kouří nečlen 0
6 2 24 žena Bc - VŠ ne nepracuje nekouří člen 0
7 4 24 žena Bc - VŠ ne pracuje nekouří člen 0
8 3 24 muž Bc - VŠ ano nepracuje nekouří nečlen 0
9 1 24 žena Bc - VŠ ne pracuje nekouří nečlen 0
10 3 24 muž Bc - VŠ ne nepracuje kouří člen 0
# ... with 59 more rows
Nejen pro faktorové, ale i pro numerické proměnné lze nabídnout jedno zjednodušení. V tomto případě nese název between(). Abychom nemuseli psát příkaz ve tvaru Věk >= 26 & Věk <= 30, můžeme do skriptu uvést pouze následující pokyn, díky němuž vypíšeme do konzole všechna pozorování pro jednice od 26 do 30 let včetně.
filter(Katan,
between(Věk, 26, 30))# A tibble: 28 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 3 26 žena VŠ ne pracuje nekouří nečlen 0
2 3 26 žena SŠ ne pracuje nekouří člen 0
3 3 26 žena Bc - VŠ ne pracuje nekouří člen 0
4 2 26 muž VŠ ne pracuje nekouří člen 0
5 3 26 žena VŠ ne pracuje nekouří člen 0
6 2 26 muž VŠ ne pracuje kouří člen 0
7 3 26 žena Bc - VŠ ne pracuje kouří nečlen 0
8 3 27 muž VŠ ne pracuje nekouří nečlen 1
9 1 27 muž VŠ ne pracuje nekouří člen 1
10 2 27 muž VŠ ne pracuje nekouří nečlen 1
# ... with 18 more rows
V závěru představení příkazu filter() se ještě podívejme na jeden příklad. Ten se nám bude hodit zejména tehdy, bude-li databáze obsahovat chybějící proměnné. Osadníkům však žádné hodnoty nechybí, proto si tu nějaké vytvoříme. Nejjednodušší bude využít příkaz edit(), který nám umožní editovat data podobně jako v tabulkovém kalkulátoru (tento příkaz jsme si představili již v Panamě).
Katan2 <- edit(Katan)Poté, co jsme například v proměnné Věk vytvořili několik chybějících hodnot (zkráceně NA - Not Available), budeme chtít zjistit jejich počet. K tomu se nám bude nejlépe hodit příkaz is.na(), který by nám též neměl být neznámý.
filter(Katan,
is.na(Věk))# A tibble: 3 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 NA žena ZŠ ne nepracuje nekouří nečlen 0
2 4 NA žena ZŠ ne nepracuje nekouří nečlen 0
3 3 NA muž ZŠ ne nepracuje nekouří člen 0
Pokud bychom však do konzole chtěli vypsat pozorování bez chybějících hodnot, použili bychom vykřičník. Takový příkaz můžeme vidět níže. V něm nám skript vytvoří datovou tabulku Katan2, která bude obsahovat pouze ženy s jedním až třemi dětmi, u nichž nechybí informace o věku.
Katan2 <- filter(Katan,
!is.na(Věk),
Pohlaví == "žena",
between(Děti, 1,3))# A tibble: 2 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 1 23 žena SŠ ano nepracuje nekouří nečlen 1
2 2 37 žena VŠ ne pracuje kouří nečlen 2
Příklad 1
Vytvořte databázi Katan2, která bude obsahovat pouze muže starší 26 let, kteří nemají vysokoškolské vzdělání.
Příklad 2
Vytvořte databázi Katan2, která bude obsahovat pouze ženy mladší 26 let, které mají vysokoškolské vzdělání a zároveň mají děti.
Další příkaz, který si probereme téměř uprostřed australského kontinentu, nese název slice(). Ten použijeme tehdy, chceme-li vytvořit novou databázi s vybranými řádky nikoliv podle určitého filtru proměnných, ale podle jejich pořadí v data frame (např. pokud je naším cílem vybrat 1. až 50. řádek databáze).
Struktura příkazu je zpočátku obdobná jako u příkazu filter(). Opět začínáme klíčovým slovesem (v tomto případě slice), za kterým bude v závorce uveden název databáze, již budeme pomyslně krájet. Následně uvedeme čísla řádků, které chceme přiřadit do nově vytvořené databáze.
Katan2 <-
slice(Katan, 1:50)# A tibble: 50 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
7 6 15 muž ZŠ ne nepracuje nekouří člen 0
8 3 15 žena ZŠ ne nepracuje nekouří člen 0
9 3 15 žena ZŠ ne nepracuje nekouří člen 0
10 9 15 žena ZŠ ne nepracuje nekouří nečlen 0
# ... with 40 more rows
Pamatujete si, jak bychom bez dplyru zvládli vyřešit předchozí příklad?
Katan2 <- Katan[1:50, ]Obdobně jako minule, i zde využijeme nesmírnou variabilitu hranatých závorek.
Chceme-li však vybrat několik nenavazujících úseků pozorování, například řádky 1 až 50 a řádky 151 až 200, není tu nic jednoduššího než využít služeb starého dobrého příkazu c().
Katan2 <-
slice(Katan, c(1:50, 151:200))# A tibble: 100 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
7 6 15 muž ZŠ ne nepracuje nekouří člen 0
8 3 15 žena ZŠ ne nepracuje nekouří člen 0
9 3 15 žena ZŠ ne nepracuje nekouří člen 0
10 9 15 žena ZŠ ne nepracuje nekouří nečlen 0
# ... with 90 more rows
Příkaz slice() není příliš komplikovaný. Přesuňme se proto k příkazu select(), jehož popis bude lehce obsáhlejší.
Příklad 3
Vytvořte databázi, která bude obsahovat pouze prvních a posledních šest pozorování z databáze Katan.
Příkaz select() nám na rozdíl od funkce filter() pomůže při výběru a přeskupení celých sloupců. Představme si třeba, že chceme vytvořit novou databázi, která bude obsahovat pouze proměnné Věk a Partie. K tomu nám bude stačit do R zapsat následující příkaz.
Katan2 <-
select(Katan,
Věk, Partie)# A tibble: 200 x 2
Věk Partie
<dbl> <dbl>
1 13 4
2 13 4
3 14 3
4 14 8
5 15 5
6 15 6
7 15 6
8 15 3
9 15 3
10 15 9
# ... with 190 more rows
Pamatujete si, jak bychom bez dplyru zvládli vyřešit předchozí příklad?
Katan2 <- Katan[, c("Věk", "Partie")]Hranaté závorky i v tomto případě zůstávají na scéně, pouze se v jejich útrobách přesouváme na pravou stranu od čárky, a to z logiky filozofie fungování těchto závorek (levá strana vybírá řádky, pravá strana definuje sloupce).
Možná se v tuto chvíli zamýšlíte nad tím, proč se vlastně učit všechny ty příkazy filter(), slice() a select(), když tu veškerou práci za ně zvládnou hranaté závorky, a to bez potřeby načítat nějaký balíček? Důvod tu existuje, i když jej prozatím ještě nevidíte. Málo kdy totiž budeme příkazy jako filter(), slice() či select() používat samostatně, jelikož je budeme chtít různě kombinovat v mnohem složitější podobě, než prozatím dovedeme. V takové případě (a stane se tomu v následující kapitole) se nám příkazy z balíčku dplyr budou velice hodit. Uvidíte sami. Proto žádné výmluvy a zpět do práce.
Máme-li v naší databázi více proměnných, které obsahují určité slovo, ale i písmeno nebo číslo, které chceme v nové databázi zachovat, využijeme příkazu contains().
Katan2 <-
select(Katan,
contains("e"))
# Databáze Katan2 bude obsahovat veškeré proměnné z databáze Katan,
# které mají ve svém názvu obsaženo písmeno „e“ bez ohledu na velká
# a malá písmena.# A tibble: 200 x 4
Partie Kolej Práce Kouření
<dbl> <chr> <chr> <chr>
1 4 ne nepracuje nekouří
2 4 ne nepracuje nekouří
3 3 ne nepracuje nekouří
4 8 ne nepracuje nekouří
5 5 ne nepracuje nekouří
6 6 ne nepracuje nekouří
7 6 ne nepracuje nekouří
8 3 ne nepracuje nekouří
9 3 ne nepracuje nekouří
10 9 ne nepracuje nekouří
# ... with 190 more rows
Příkaz select() lze využít i v případě, chceme-li pouze změnit pořadí jednotlivých proměnných v databázi.
Katan2 <-
select(Katan,
Věk, Partie, Kolej, Kouření, Klub, Práce, Vzdělání, Děti)
# Příkaz vytvoří proměnnou Katan2, která bude obsahovat vybrané
# proměnné z databáze Katan ve výše uvedeném pořadí.# A tibble: 200 x 8
Věk Partie Kolej Kouření Klub Práce Vzdělání Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <dbl>
1 13 4 ne nekouří nečlen nepracuje ZŠ 0
2 13 4 ne nekouří nečlen nepracuje ZŠ 0
3 14 3 ne nekouří člen nepracuje ZŠ 0
4 14 8 ne nekouří nečlen nepracuje ZŠ 0
5 15 5 ne nekouří člen nepracuje ZŠ 0
6 15 6 ne nekouří člen nepracuje ZŠ 0
7 15 6 ne nekouří člen nepracuje ZŠ 0
8 15 3 ne nekouří člen nepracuje ZŠ 0
9 15 3 ne nekouří člen nepracuje ZŠ 0
10 15 9 ne nekouří nečlen nepracuje ZŠ 0
# ... with 190 more rows
Máme-li však za cíl pouze přesunout určitou proměnnou na první pozici, není nutné ručně vypisovat názvy ostatních sloupců, jelikož si můžeme vypomoci příkazem everything().
Katan2 <-
select(Katan,
Věk, everything())
# Příkaz vytvoří databázi Katan2, kde na prvním místě bude zobrazena
# proměnná Věk a poté všechny ostatní podle jejich pořadí z původní
# databáze Katan.# A tibble: 200 x 9
Věk Partie Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 13 4 žena ZŠ ne nepracuje nekouří nečlen 0
2 13 4 žena ZŠ ne nepracuje nekouří nečlen 0
3 14 3 muž ZŠ ne nepracuje nekouří člen 0
4 14 8 muž ZŠ ne nepracuje nekouří nečlen 0
5 15 5 muž ZŠ ne nepracuje nekouří člen 0
6 15 6 muž ZŠ ne nepracuje nekouří člen 0
7 15 6 muž ZŠ ne nepracuje nekouří člen 0
8 15 3 žena ZŠ ne nepracuje nekouří člen 0
9 15 3 žena ZŠ ne nepracuje nekouří člen 0
10 15 9 žena ZŠ ne nepracuje nekouří nečlen 0
# ... with 190 more rows
S příkazem select() lze proměnné nejenom přeskupovat, ale i mazat. Pokud jich k odstranění máme víc, není to též žádná komplikace, jelikož lze použít nám dobře známý operátor dvojtečka.
Katan2 <-
select(Katan,
-Vzdělání, -(Práce:Pohlaví))
# Příkaz odstraní proměnnou Vzdělání a dále všechny proměnné mezi sloupci
# Práce a Pohlaví (včetně těchto dvou) z databáze Katan.
# lze zapsat i pomocí příkazu c(): select(Katan, -c(Vzdělání, Práce:Pohlaví))# A tibble: 200 x 5
Partie Věk Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <dbl>
1 4 13 nekouří nečlen 0
2 4 13 nekouří nečlen 0
3 3 14 nekouří člen 0
4 8 14 nekouří nečlen 0
5 5 15 nekouří člen 0
6 6 15 nekouří člen 0
7 6 15 nekouří člen 0
8 3 15 nekouří člen 0
9 3 15 nekouří člen 0
10 9 15 nekouří nečlen 0
# ... with 190 more rows
Nechce se vám stále vypisovat jednotlivé názvy proměnných? Zkuste použít jejich číselné pořadí z původní databáze.
Katan2 <-
select(Katan,
-3, -(5:9))
# Příkaz odstraní proměnnou Vzdělání a dále všechny proměnné mezi sloupci
# Práce a Pohlaví (včetně těchto dvou) z databáze Katan.
# lze zapsat i pomocí příkazu c(): select(Katan, -c(3, 5:9))# A tibble: 200 x 3
Partie Věk Vzdělání
<dbl> <dbl> <chr>
1 4 13 ZŠ
2 4 13 ZŠ
3 3 14 ZŠ
4 8 14 ZŠ
5 5 15 ZŠ
6 6 15 ZŠ
7 6 15 ZŠ
8 3 15 ZŠ
9 3 15 ZŠ
10 9 15 ZŠ
# ... with 190 more rows
Příklad 4
Vytvořte databázi, která bude na prvních dvou místech obsahovat proměnné Věk a Práce a na dalších pozicích veškeré ostatní proměnné z databáze Katan v jejich původním pořadí.
Příklad 5
Vytvořte databázi, která bude obsahovat pouze poslední čtyři proměnné z databáze Katan.
Příklad 6
Vytvořte databázi, která na prvním místě bude obsahovat proměnnou Pohlaví a dále pak všechny ostatní proměnné databáze Katan kromě proměnných Partie a Klub.
Ze druhé kapitoly si možná pamatujete na jeden dosti krkolomný příkaz, pomocí něhož jsme se naučili přejmenovat proměnnou v rámci data frame. Není divu, proč byl krkolomný. Učili jsme se o něm v chudé americké Panamě, zatímco nyní se nacházíme v Melbourne, které bylo časopisem The Economist považováno za nejlepší místo k životu mezi léty 2010 - 2017. Pro milovníky dopravy též zmíním i fakt, že v Melbourne nalezneme nejdelší tramvajovou síť na světě.
names(Katan)[names(Katan) == "Věk"] <- "Age"# A tibble: 200 x 9
Partie Age Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
7 6 15 muž ZŠ ne nepracuje nekouří člen 0
8 3 15 žena ZŠ ne nepracuje nekouří člen 0
9 3 15 žena ZŠ ne nepracuje nekouří člen 0
10 9 15 žena ZŠ ne nepracuje nekouří nečlen 0
# ... with 190 more rows
Jak je vidět, panamský příkaz není z nejjednodušších a lépe se bude určitě pamatovat ten následující z balíčku dplyr, pomocí kterého přejmenujeme proměnné Vzdělání a Partie na Education a Games.
Katan2 <-
rename(Katan, "Education" = Vzdělání,
"Games" = Partie)
# Všimněte si, že nejdříve píšeme nový název proměnné a teprve až za
# rovnítko zapíšeme původní název proměnné, v našem případě Vzdělání a Partie.# A tibble: 200 x 9
Games Věk Pohlaví Education Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
7 6 15 muž ZŠ ne nepracuje nekouří člen 0
8 3 15 žena ZŠ ne nepracuje nekouří člen 0
9 3 15 žena ZŠ ne nepracuje nekouří člen 0
10 9 15 žena ZŠ ne nepracuje nekouří nečlen 0
# ... with 190 more rows
Pamatujete si, jak bychom bez dplyru zvládli přejmenovat všechny proměnné?
names(Katan) <-
c("Games", "Age", "Gender", "Education", "Dormitory",
"Job", "Children", "Smoke", "Club") # A tibble: 200 x 9
Games Age Gender Education Dormitory Job Children Smoke Club
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
7 6 15 muž ZŠ ne nepracuje nekouří člen 0
8 3 15 žena ZŠ ne nepracuje nekouří člen 0
9 3 15 žena ZŠ ne nepracuje nekouří člen 0
10 9 15 žena ZŠ ne nepracuje nekouří nečlen 0
# ... with 190 more rows
Chceme-li však přejmenovat pouze jednu proměnnou a nechceme přitom využít ani dplyr a ani příkaz, který byl uveden na úvod, můžeme použít následující pokyn.
colnames(Katan)[2] <- "Age"
# Číslo dvě v hranaté závorce symbolizuje pořadí proměnné, u které
# název měníme.Příklad 7
V databázi Katan změňte název proměnné Práce a Děti na Job a Children.
Příklad 8
V databázi Katan změňte názvy všech proměnných na názvy dle vašeho uvážení bez použití příkazu rename().
Představme si, že jsme v největším australském městě nalezli přebohatou žílu dat, která má však pojmenované řádky (ty třeba obsahují názvy států, jména, zkrátka cokoliv). My však z těchto pojmenování chceme vytvořit další proměnnou a místo těchto názvů zanechat obvyklé číselné označení řádků, jež je nejen pro práci s data frame mnohem praktičtější. Jak to provedeme? Použijeme příkaz add_rownames().
Abychom si však výše uvedený příkaz mohli názorně představit, musíme se nejdříve naučit pravý opak. Prvně si tedy vytvoříme vektor jmen hráčů pro naši databázi Katan, který následně použijeme pro pojmenování řádků v databázi. Teprve až poté si ukážeme, jak funguje samotný příkaz add_rownames(), který z našich jmen učiní další proměnnou databáze. Buďme nicméně alespoň trochu kreativní a vytvořme si vektor se skutečnými jmény. K tomu budeme potřebovat balíček pod názvem randomNames. Nainstalujme ho, spusťme a vytvořme vektor 200 jmen.
install.packages("randomNames")
library(randomNames)
Jména <- randomNames(200)
head(Jména)[1] "Rainone, Nicholas" "Pearson, Nathan" "al-Hallal, Randa"
[4] "Liu, Mengyi" "Abraha, Tre'Sean" "el-Bahri, Sadoon"
Chceme-li si s příkazem randomNames trochu pohrát, máme možnost vybrat si jména dokonce i podle pohlaví či etnicity (více naleznete zde).
Jména <- randomNames(200,
ethnicity = 5,
which.names = "both",
name.order = "last.first",
name.sep = ", ",
sample.with.replacement = TRUE,
return.complete.data = FALSE)
head(Jména)[1] "Greenberg, Matthew" "Coleman, Michael" "Nemitz, Angelica"
[4] "Henson, Ashley" "Cronin, Jordan" "Ross, Kayla"
Výsledný vektor Jména nyní můžeme pomocí následujícího příkazu spojit s databází Katan, u níž získáme pojmenované řádky.
Katan2 <-
data.frame(Katan, row.names = Jména)
head(Katan2) Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub
Knutsen, Benjamin 4 13 žena ZŠ ne nepracuje nekouří nečlen
Freeman, Allison 4 13 žena ZŠ ne nepracuje nekouří nečlen
Fielding, Juliun 3 14 muž ZŠ ne nepracuje nekouří člen
Johnson, Sawyer 8 14 muž ZŠ ne nepracuje nekouří nečlen
Dawursk, Bryanna 5 15 muž ZŠ ne nepracuje nekouří člen
Shleyfer, Steven 6 15 muž ZŠ ne nepracuje nekouří člen
Děti
Knutsen, Benjamin 0
Freeman, Allison 0
Fielding, Juliun 0
Johnson, Sawyer 0
Dawursk, Bryanna 0
Shleyfer, Steven 0
V tuto chvíli jsme konečně připraveni použít příkaz add_rownames(), kvůli kterému jsme proměnnou Jména vytvářeli. Ten nám názvy řádků převede do nově vytvořené proměnné JménaHráčů, která se stane součástí databáze Katan3.
Katan3 <-
add_rownames(Katan2, "JménaHráčů")# A tibble: 200 x 10
JménaHráčů Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<chr> <dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 Myers, Derrick 4 13 žena ZŠ ne nepra~ nekouří nečl~ 0
2 Stack, Gardner 4 13 žena ZŠ ne nepra~ nekouří nečl~ 0
3 Whitman Smith~ 3 14 muž ZŠ ne nepra~ nekouří člen 0
4 Williams, Che~ 8 14 muž ZŠ ne nepra~ nekouří nečl~ 0
5 Carpenter, Ty~ 5 15 muž ZŠ ne nepra~ nekouří člen 0
6 Benavidez, Ka~ 6 15 muž ZŠ ne nepra~ nekouří člen 0
7 Buscher, Lori~ 6 15 muž ZŠ ne nepra~ nekouří člen 0
8 Mckenzie, Bre~ 3 15 žena ZŠ ne nepra~ nekouří člen 0
9 Price, Jamilyn 3 15 žena ZŠ ne nepra~ nekouří člen 0
10 Mcgaughey, So~ 9 15 žena ZŠ ne nepra~ nekouří nečl~ 0
# ... with 190 more rows
A to bylo vše. S dplyrem ale ještě zdaleka nekončíme, neboť nás v této kapitole čeká ještě šest příkazů.
Příklad 9
Vytvořte proměnnou Kód, která bude obsahovat 200 unikátních kódů složených pouze z písmen. Kód by měl vždy obsahovat celkově pět náhodných písmen spojených dohromady (a to kvůli anonymizaci dat vzhledem k GDPR). Následně z těchto kódových označení vytvořte pojmenované řádky v rámci databáze Katan. Poté tyto kódy převeďte do nově vzniklé proměnné Kódová_označení, která se stane součástí databáze Katan tak, aby samotné řádky získaly zpět číselné označení.
Víte, co se v roce 1993 stalo v Aucklandu? Dva muži ve středním věku neměli co dělat, a proto začali věnovat svůj čas něčemu, co nemohli nazvat horším názvem než písmenem R. Zapamatujte si dobře jejich tváře. V případě jakýchkoli stížností na tento programovací jazyk se proto neobracejte na Rlandio, nýbrž přeneste svůj hněv na tyto dva pány, jejichž jména jsou Ross Ihaka a Robert Gentleman.
Pro tuto chvíli se však uklidněme a vraťme se zpět k dplyru. Chceme-li v rámci databáze vytvořit novou proměnnou (či aktualizovat nějakou původní), lze též využít balíčku dplyr, respektive příkazu mutate(). Řekněme třeba, že naše databáze Katan slaví své první narozeniny a my ji chceme aktualizovat tím, že věk hráčů zvýšíme též o jeden rok a přitom vytvoříme novou proměnnou VěkPlus. V takovém případě původní proměnná Věk zůstane zachována. Pokud bychom nicméně chtěli původní proměnnou Věk pouze přepsat novými hodnotami a žádnou novou proměnnou nevytvářet, stačilo by v následujícím skriptu pouze změnit název proměnné VěkPlus na Věk.
# chceme-li vytvořit novou proměnnou
Katan2 <-
mutate(Katan,
VěkPlus = Věk + 1)
# V případě, že bychom měli v proměnné Věk chybějící hodnoty (NA),
# zůstane i nová hodnota v proměnné VěkPlus jako NA a
# nikoliv jako 1, tj. NA + 1 != 1, ale stále NA.
# chceme-li přepsat stávající proměnnou
Katan2 <-
mutate(Katan,
Věk = Věk + 1)# A tibble: 200 x 10
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti VěkPlus
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0 14
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0 14
3 3 14 muž ZŠ ne nepracuje nekouří člen 0 15
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0 15
5 5 15 muž ZŠ ne nepracuje nekouří člen 0 16
6 6 15 muž ZŠ ne nepracuje nekouří člen 0 16
7 6 15 muž ZŠ ne nepracuje nekouří člen 0 16
8 3 15 žena ZŠ ne nepracuje nekouří člen 0 16
9 3 15 žena ZŠ ne nepracuje nekouří člen 0 16
10 9 15 žena ZŠ ne nepracuje nekouří nečlen 0 16
# ... with 190 more rows
Pokud nově vzniklou proměnnou či proměnné nechceme připojit ke stávající databázi (v našem případě Katan), ale chceme je uchovávat samostatně (jako vektor), využijeme místo mutate() příkaz transmute().
NováDatabáze <-
transmute(Katan,
VěkPlus = Věk + 1)# A tibble: 200 x 1
VěkPlus
<dbl>
1 14
2 14
3 15
4 15
5 16
6 16
7 16
8 16
9 16
10 16
# ... with 190 more rows
Pamatujete si, jak bychom bez dplyru zvládli vyřešit předchozí příklad?
# chceme vytvořit novou proměnnou
Katan$VěkPlus <- Katan$Věk + 1
# chceme přepsat stávající proměnnou
Katan$Věk <- Katan$Věk + 1Příkaz mutate() (respektive transmute()) může obsahovat i složitější funkce, jako například if_else(). Příkaz ifelse() už ale známe, nicméně bez podtržítka, tak jaký je mezi nimi vlastně rozdíl? Veskrze žádný. Jeden drobný tu však přeci jenom existuje. Funkce if_else() z balíčku dplyr pracuje mnohem rychleji než obyčejné iflese(), takže pokud pracujeme s doopravdy velkým množstvím dat (statisíce až miliony řádků), je tato funkce z výpočetního hlediska mnohem výhodnější.
Vyzkoušejme si příkaz if_else() a mutate() pomocí příkladu, u kterého budeme chtít vytvořit v rámci databáze Katan novou proměnnou s názvem VěkSkupiny. Ta by měla náš soubor dat rozdělit do následujících čtyř skupin (dospělá žena, dospělý muž, nezletilá slečna, nezletilý kluk).
Katan2 <-
mutate(Katan,
VěkSkupiny =
if_else(
Katan$Věk >= 18 &
Katan$Pohlaví == "žena","dospělá žena",
if_else(
Katan$Věk>=18 &
Katan$Pohlaví == "muž", "dospělý muž",
if_else(
Katan$Věk<18 &
Katan$Pohlaví == "žena", "nezletilá slečna",
if_else(
Katan$Věk<18 &
Katan$Pohlaví == "muž", "nezletilý kluk", "NA")))))# A tibble: 200 x 10
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti VěkSkupiny
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl> <chr>
1 4 13 žena ZŠ ne neprac~ nekouří nečlen 0 nezletilá s~
2 4 13 žena ZŠ ne neprac~ nekouří nečlen 0 nezletilá s~
3 3 14 muž ZŠ ne neprac~ nekouří člen 0 nezletilý k~
4 8 14 muž ZŠ ne neprac~ nekouří nečlen 0 nezletilý k~
5 5 15 muž ZŠ ne neprac~ nekouří člen 0 nezletilý k~
6 6 15 muž ZŠ ne neprac~ nekouří člen 0 nezletilý k~
7 6 15 muž ZŠ ne neprac~ nekouří člen 0 nezletilý k~
8 3 15 žena ZŠ ne neprac~ nekouří člen 0 nezletilá s~
9 3 15 žena ZŠ ne neprac~ nekouří člen 0 nezletilá s~
10 9 15 žena ZŠ ne neprac~ nekouří nečlen 0 nezletilá s~
# ... with 190 more rows
Příkaz if_else() je velice intuitivní. Přesto ale obdobně jako u ifelse() nezapomeňte u posledního řádku na NA, které tu je pro případ, že by zde ve skriptu nastala situace, při které by řádek databáze nevyhovoval ani jedné z podmínek. V takovém případě by byla hodnota proměnné pojmenována právě jako NA.
Příklad 10
Vytvořte v rámci databáze Katan novou proměnnou Gambler, která bude rozdělovat hráče do čtyř skupin podle proměnné Partie na příležitostný hráč (jedna až dvě partie za měsíc), častý hráč (tři až čtyři partie za měsíc), deskový gambler (pět až šest partií za měsíc) a král osadníků (více jak sedm partií za měsíc).
Příkaz distinct() si klade za cíl zobrazovat unikátní hodnoty v proměnné. Pracujeme-li proto například s faktory, ukáže nám tato funkce jednotlivé názvy hodnot, kterých daná proměnná v databázi alespoň jednou nabývá. Příkaz distinct() nicméně lze použít i u numerických proměnných, zkrátka u všech.
Věk2 <- distinct(Katan, Věk)# A tibble: 44 x 1
Věk
<dbl>
1 13
2 14
3 15
4 16
5 17
6 18
7 19
8 20
9 21
10 22
# ... with 34 more rows
V rámci příkazu distinct() lze do příkazu zapsat i více proměnných. Pokud tak chceme zjistit počet unikátních kombinací počtu let a pohlaví, využijeme následující formy příkazu.
Věk2 <- distinct(Katan, Věk, Pohlaví)# A tibble: 60 x 2
Věk Pohlaví
<dbl> <chr>
1 13 žena
2 14 muž
3 15 muž
4 15 žena
5 16 muž
6 16 žena
7 17 žena
8 17 muž
9 18 muž
10 18 žena
# ... with 50 more rows
Podíváme-li se na nově vzniklou proměnnou Věk2, zjistíme, že obsahuje 60 unikátních variant věku a pohlaví. Jak však zjistit konkrétní počty těchto jednotlivých kombinací? Není nic jednoduššího než použít příkaz table(). Ačkoliv je sice dplyr plný různých příkazů, není všemocný, proto tudíž nezapomínejme ani na ostatní příkazy mimo něj.
table(Katan$Věk, Katan$Pohlaví)
muž žena
13 0 2
14 2 0
15 4 3
16 6 3
17 4 2
18 3 4
19 3 6
20 4 4
21 12 4
22 9 3
23 6 2
24 6 5
25 4 10
26 2 5
27 5 1
28 6 1
29 5 0
30 3 0
31 9 0
32 6 0
33 3 0
34 4 0
35 5 0
36 1 0
37 3 1
38 3 0
39 1 0
40 2 0
41 3 0
42 1 0
43 1 1
44 0 1
46 1 0
47 1 0
48 1 0
49 3 0
50 3 0
51 1 0
62 1 0
63 1 0
68 1 0
69 1 0
74 1 0
75 1 0
Příklad 11
Zjistěte, kolik unikátních kombinací počtu dětí a vzdělání obsahuje databáze Katan.
Předposlední příkaz nynější kapitoly si probereme v místech jedné z nejhorších bitev 2. sv. války v Pacifiku, tj. v místech bitvy o Guadalcanal. Navzdory hrozivému umístění této lekce se však žádných děsivých scén nebojte, neboť příkaz arrange() je velice mírumilovný, neškodný a též užitečný. S jeho pomocí totiž dokážeme seřadit data podle určité proměnné, v našem následujícím příkladu podle proměnné Věk, respektive Pohlaví.
Katan2 <-
arrange(Katan,
Věk, Pohlaví)# A tibble: 200 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
7 6 15 muž ZŠ ne nepracuje nekouří člen 0
8 5 15 muž ZŠ ne nepracuje nekouří nečlen 0
9 3 15 žena ZŠ ne nepracuje nekouří člen 0
10 3 15 žena ZŠ ne nepracuje nekouří člen 0
# ... with 190 more rows
Chceme-li data seřadit od nejvyšších hodnot po ty nejnižší, přidáme před název proměnné parametr desc (desc(Věk)).
Katan2 <-
arrange(Katan, desc(Věk), Pohlaví)# A tibble: 200 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 1 75 muž ZŠ ne pracuje kouří nečlen 2
2 2 74 muž ZŠ ne pracuje kouří nečlen 2
3 1 69 muž ZŠ ne pracuje kouří nečlen 4
4 2 68 muž ZŠ ne pracuje kouří nečlen 4
5 1 63 muž SŠ ne pracuje kouří nečlen 2
6 1 62 muž ZŠ ne pracuje kouří nečlen 2
7 1 51 muž SŠ ne pracuje nekouří nečlen 2
8 1 50 muž SŠ ne pracuje nekouří nečlen 2
9 2 50 muž SŠ ne pracuje kouří nečlen 3
10 1 50 muž SŠ ne pracuje kouří nečlen 2
# ... with 190 more rows
Pamatujete si, jak bychom bez dplyru zvládli vyřešit předchozí příklad?
Katan2 <- Katan[order(Katan$Věk), ]Pokud chceme data seřadit od nejstarších hráčů po ty nejmladší, použijeme parametr decreasing = TRUE.
Katan2 <- Katan[order(Katan$Věk, decreasing = TRUE), ]Příklad 12
Seřaďte databázi Katan podle proměnné Věk (vzestupně), následně Děti (sestupně) a na závěr podle proměnné Pohlaví.
V Port Moresby nás čeká poslední příkaz této kapitoly s názvem join(). Nezřídka kdy se nám v naší práci bude stávat, že bychom potřebovali pracovat s různými kombinacemi rozdílných datových tabulek. K tomu nám pomůže právě funkce join(). Variant této funkce je však tolik, že bude lépe si je nejdříve ukázat v následujícím přehledu. Teprve až poté se podíváme na praktické úlohy.
Kombinací je doopravdy hodně. Ukažme si proto alespoň dva příklady. Řekněme, že máme dvě databáze Katan_01 a Katan_02, které mají společnou jednu proměnnou s názvem Pořadí a my chceme, aby se tyto tabulky spojily právě podle této proměnné. Abychom si příklad mohli ukázat, musíme si nejdříve tyto databáze vytvořit.
Katan_01 <- mutate(Katan,
Pořadí = 1:200)
Katan_01 <- select(Katan_01, c(10, 1:5))
Katan_02 <- mutate(Katan,
Pořadí = sample(1:200, size = 200, replace = FALSE))
Katan_02 <- select(Katan_02, 6:10)[1] "Katan_01"
# A tibble: 200 x 6
Pořadí Partie Věk Pohlaví Vzdělání Kolej
<int> <dbl> <dbl> <chr> <chr> <chr>
1 1 4 13 žena ZŠ ne
2 2 4 13 žena ZŠ ne
3 3 3 14 muž ZŠ ne
4 4 8 14 muž ZŠ ne
5 5 5 15 muž ZŠ ne
6 6 6 15 muž ZŠ ne
7 7 6 15 muž ZŠ ne
8 8 3 15 žena ZŠ ne
9 9 3 15 žena ZŠ ne
10 10 9 15 žena ZŠ ne
# ... with 190 more rows
[1] "Katan_02"
# A tibble: 200 x 5
Pořadí Práce Kouření Klub Děti
<int> <chr> <chr> <chr> <dbl>
1 157 nepracuje nekouří nečlen 0
2 15 nepracuje nekouří nečlen 0
3 188 nepracuje nekouří člen 0
4 164 nepracuje nekouří nečlen 0
5 118 nepracuje nekouří člen 0
6 138 nepracuje nekouří člen 0
7 38 nepracuje nekouří člen 0
8 154 nepracuje nekouří člen 0
9 200 nepracuje nekouří člen 0
10 137 nepracuje nekouří nečlen 0
# ... with 190 more rows
Databáze jsou vytvořené, jejich společným jmenovatelem je proměnná Pořadí. Nyní budeme chtít, aby se proměnné z databáze Katan_02 připojily k databázi Katan_01. Výsledek by měl být následně přiřazen do databáze Katan_03.
Katan_03 <-
left_join(Katan_01, Katan_02, by = "Pořadí")# A tibble: 200 x 10
Pořadí Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<int> <dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 1 4 13 žena ZŠ ne pracuje nekouří nečlen 3
2 2 4 13 žena ZŠ ne pracuje nekouří nečlen 0
3 3 3 14 muž ZŠ ne pracuje nekouří nečlen 2
4 4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 5 15 muž ZŠ ne pracuje kouří nečlen 0
6 6 6 15 muž ZŠ ne pracuje kouří nečlen 0
7 7 6 15 muž ZŠ ne nepracuje nekouří nečlen 0
8 8 3 15 žena ZŠ ne pracuje kouří nečlen 2
9 9 3 15 žena ZŠ ne nepracuje nekouří nečlen 1
10 10 9 15 žena ZŠ ne pracuje nekouří nečlen 0
# ... with 190 more rows
V případě, že bychom chtěli připojit proměnné z databáze Katan_01 k databázi Katan_02, použili bychom příkaz nikoliv left_join(), ale right_join().
Co když ale chceme, abychom z databáze Katan_02 použili jen dvě proměnné, dejme tomu Klub a Děti? Buďto můžeme nepotřebné proměnné z Katan_2 vymazat už předem či tak učinit až v průběhu funkce join(), jak je to ukázáno v následujícím skriptu. Stačí využít dalšího příkazu z balíčku dplyr, konkrétně příkazu select().
Katan_04 <-
left_join(Katan_01, select(Katan_02, 1, 4:5), by = "Pořadí")
# Nezapomeňte do příkazu select() vložit též proměnnou, podle které se
# spojení databází provede, tj. proměnná Pořadí (1).# A tibble: 200 x 8
Pořadí Partie Věk Pohlaví Vzdělání Kolej Klub Děti
<int> <dbl> <dbl> <chr> <chr> <chr> <chr> <dbl>
1 1 4 13 žena ZŠ ne nečlen 0
2 2 4 13 žena ZŠ ne nečlen 0
3 3 3 14 muž ZŠ ne člen 0
4 4 8 14 muž ZŠ ne nečlen 0
5 5 5 15 muž ZŠ ne člen 0
6 6 6 15 muž ZŠ ne člen 0
7 7 6 15 muž ZŠ ne člen 0
8 8 3 15 žena ZŠ ne člen 0
9 9 3 15 žena ZŠ ne člen 0
10 10 9 15 žena ZŠ ne nečlen 0
# ... with 190 more rows
Kromě příkazu select() by samozřejmě šlo využít i hranatých závorek jako v následujícím pokynu.
Katan_04 <-
left_join(Katan_01, Katan_02[, c(1, 4:5)], by = "Pořadí")# A tibble: 200 x 8
Pořadí Partie Věk Pohlaví Vzdělání Kolej Klub Děti
<int> <dbl> <dbl> <chr> <chr> <chr> <chr> <dbl>
1 1 4 13 žena ZŠ ne nečlen 0
2 2 4 13 žena ZŠ ne nečlen 0
3 3 3 14 muž ZŠ ne člen 0
4 4 8 14 muž ZŠ ne nečlen 0
5 5 5 15 muž ZŠ ne člen 0
6 6 6 15 muž ZŠ ne člen 0
7 7 6 15 muž ZŠ ne člen 0
8 8 3 15 žena ZŠ ne člen 0
9 9 3 15 žena ZŠ ne člen 0
10 10 9 15 žena ZŠ ne nečlen 0
# ... with 190 more rows
A to je z šesté kapitoly vše. pokud se vám však již v tuto chvíli stýská nejen po dplyru, ale hlavně po ggplot2, nevěšte hlavu. V následující kapitole se s nimi totiž opětovně shledáme. Přesouváme se do Asie.
Příklad 13
Představte si, že máte dvě databáze, které chcete vzájemně propojit. První tabulka například obsahuje jméno, příjmení studenta a jeho číslo v třídním výkazu. Ta druhá zahrnuje známky z chemie, fyziky a též číslo studenta (ID), které je pojítkem obou databází. Vaším cílem je spojit tyto databáze do jedné, jež bude obsahovat celkem pět sloupců (jméno, příjmení, ID, chemie a fyzika).
data_01 <-
data.frame(
ID = c(23, 45, 50, 60, 70,
89, 40, 65, 44, 77),
jméno = c("Jakub", "Ondřej", "Jana",
"Eva", "David", "Franta",
"Filip", "Magda", "Bára",
"Jakub"),
příjmení = c("Chini", "Špetík",
"Nováková", "Dvořáková",
"Svoboda", "Novotný",
"Černý", "Svobodová",
"Procházková", "Kučera"))
data_02 <-
data.frame(
ID = c(23, 45, 50, 60, 70,
89, 40, 65, 44, 77),
chemie = c(2, 1, 2, 3, 4,
5, 3, 1, 2, 2),
fyzika = c(2, 1, 2, 4, 1,
5, 1, 1, 3, 1)) Příklad 1
Vytvořte databázi Katan2, která bude obsahovat pouze muže starší 26 let, kteří nemají vysokoškolské vzdělání.
Katan2 <-
filter(Katan,
Pohlaví == "muž",
Věk > 26,
!(Vzdělání == "Bc - VŠ" | Vzdělání == "VŠ"))# A tibble: 39 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 3 28 muž SŠ ne pracuje nekouří nečlen 1
2 2 28 muž SŠ ne pracuje kouří člen 1
3 2 29 muž SŠ ne pracuje nekouří nečlen 1
4 2 29 muž SŠ ne pracuje nekouří nečlen 1
5 1 30 muž SŠ ne pracuje nekouří nečlen 1
6 1 31 muž SŠ ne pracuje nekouří nečlen 2
7 1 31 muž SŠ ne pracuje nekouří nečlen 1
8 1 31 muž SŠ ne pracuje nekouří nečlen 1
9 1 31 muž SŠ ne pracuje kouří nečlen 1
10 1 32 muž SŠ ne pracuje nekouří nečlen 2
# ... with 29 more rows
Příklad 2
Vytvořte databázi Katan2, která bude obsahovat pouze ženy starší 26 let, které mají vysokoškolské vzdělání a zároveň mají děti.
Katan2 <-
filter(Katan,
Pohlaví == "žena",
Věk > 26,
(Vzdělání == "Bc - VŠ" | Vzdělání == "VŠ") & Děti != 0)# A tibble: 1 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 2 37 žena VŠ ne pracuje kouří nečlen 2
Příklad 3
Vytvořte databázi, která bude obsahovat pouze prvních a posledních šest pozorování z databáze Katan.
Katan2 <-
slice(Katan, c(1:6, 155:200))# A tibble: 12 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
7 1 62 muž ZŠ ne pracuje kouří nečlen 2
8 1 63 muž SŠ ne pracuje kouří nečlen 2
9 2 68 muž ZŠ ne pracuje kouří nečlen 4
10 1 69 muž ZŠ ne pracuje kouří nečlen 4
11 2 74 muž ZŠ ne pracuje kouří nečlen 2
12 1 75 muž ZŠ ne pracuje kouří nečlen 2
Příklad 4
Vytvořte databázi, která bude na prvních dvou místech obsahovat proměnné Věk a Práce a na dalších pozicích veškeré ostatní proměnné z databáze Katan v jejich původním pořadí.
Katan2 <- select(Katan, Věk, Práce, everything())# A tibble: 200 x 9
Věk Práce Partie Pohlaví Vzdělání Kolej Kouření Klub Děti
<dbl> <chr> <dbl> <chr> <chr> <chr> <chr> <chr> <dbl>
1 13 nepracuje 4 žena ZŠ ne nekouří nečlen 0
2 13 nepracuje 4 žena ZŠ ne nekouří nečlen 0
3 14 nepracuje 3 muž ZŠ ne nekouří člen 0
4 14 nepracuje 8 muž ZŠ ne nekouří nečlen 0
5 15 nepracuje 5 muž ZŠ ne nekouří člen 0
6 15 nepracuje 6 muž ZŠ ne nekouří člen 0
7 15 nepracuje 6 muž ZŠ ne nekouří člen 0
8 15 nepracuje 3 žena ZŠ ne nekouří člen 0
9 15 nepracuje 3 žena ZŠ ne nekouří člen 0
10 15 nepracuje 9 žena ZŠ ne nekouří nečlen 0
# ... with 190 more rows
Příklad 5
Vytvořte databázi, která bude obsahovat pouze poslední čtyři proměnné z databáze Katan.
Katan2 <- select(Katan, 6:9)# A tibble: 200 x 4
Práce Kouření Klub Děti
<chr> <chr> <chr> <dbl>
1 nepracuje nekouří nečlen 0
2 nepracuje nekouří nečlen 0
3 nepracuje nekouří člen 0
4 nepracuje nekouří nečlen 0
5 nepracuje nekouří člen 0
6 nepracuje nekouří člen 0
7 nepracuje nekouří člen 0
8 nepracuje nekouří člen 0
9 nepracuje nekouří člen 0
10 nepracuje nekouří nečlen 0
# ... with 190 more rows
Příklad 6
Vytvořte databázi, která na prvním místě bude obsahovat proměnnou Pohlaví a dále pak všechny ostatní proměnné databáze Katan kromě proměnných Partie a Klub.
Katan2 <- select(Katan, Pohlaví, everything(), -Partie, -Klub)
# Dávejme veliký pozor na pořadí jednotlivých proměnných v příkazu select().
# Dle zadání, jako první zapisujeme proměnnou Pohlaví. Dále pak volíme
# příkaz everything (), který však do nově vytvořené databáze Katan2 přidá
# i proměnné Partie a Klub, což nechceme. Z tohoto důvodu jsou na dalších
# místech v příkazu select zapsány tyto dvě proměnné s mínusovým znaménkem.
# Kdybychom však zaměnili pořadí proměnných za -Partie, -Klub, everything(),
# staly by se proměnné Partie a Klub součástí databáze Katan2.# A tibble: 200 x 7
Pohlaví Věk Vzdělání Kolej Práce Kouření Děti
<chr> <dbl> <chr> <chr> <chr> <chr> <dbl>
1 žena 13 ZŠ ne nepracuje nekouří 0
2 žena 13 ZŠ ne nepracuje nekouří 0
3 muž 14 ZŠ ne nepracuje nekouří 0
4 muž 14 ZŠ ne nepracuje nekouří 0
5 muž 15 ZŠ ne nepracuje nekouří 0
6 muž 15 ZŠ ne nepracuje nekouří 0
7 muž 15 ZŠ ne nepracuje nekouří 0
8 žena 15 ZŠ ne nepracuje nekouří 0
9 žena 15 ZŠ ne nepracuje nekouří 0
10 žena 15 ZŠ ne nepracuje nekouří 0
# ... with 190 more rows
Příklad 7
V databázi Katan změňte název proměnné Práce a Děti na Job a Children.
Katan2 <-
rename(Katan, "Job" = Práce, "Children" = Děti)# A tibble: 200 x 9
Partie Věk Pohlaví Vzdělání Kolej Job Kouření Klub Children
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
7 6 15 muž ZŠ ne nepracuje nekouří člen 0
8 3 15 žena ZŠ ne nepracuje nekouří člen 0
9 3 15 žena ZŠ ne nepracuje nekouří člen 0
10 9 15 žena ZŠ ne nepracuje nekouří nečlen 0
# ... with 190 more rows
Příklad 8
V databázi Katan změňte názvy všech proměnných na názvy dle vašeho uvážení bez použití příkazu rename().
names(Katan) <-
c("Games", "Age", "Education", "Hall_of_residence", "Job",
"Children", "Smoke", "Club", "Gender") # A tibble: 200 x 9
Games Age Education Hall_of_residence Job Children Smoke Club Gender
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
7 6 15 muž ZŠ ne nepracuje nekouří člen 0
8 3 15 žena ZŠ ne nepracuje nekouří člen 0
9 3 15 žena ZŠ ne nepracuje nekouří člen 0
10 9 15 žena ZŠ ne nepracuje nekouří nečlen 0
# ... with 190 more rows
Příklad 9
Vytvořte proměnnou Kód, která bude obsahovat 200 unikátních kódů složených pouze z písmen. Kód by měl vždy obsahovat celkově pět náhodných písmen spojených dohromady (a to kvůli anonymizaci dat vzhledem k GDPR). Následně z těchto kódových označení vytvořte pojmenované řádky v rámci databáze Katan. Poté tyto kódy převeďte do nově vzniklé proměnné Kódová_označení, která se stane součástí databáze Katan tak, aby samotné řádky získaly zpět číselné označení.
Jména <-
replicate(200,
paste(sample(LETTERS, 5, replace = TRUE),
collapse = ""))
Katan2 <-
data.frame(Katan, row.names = Jména)
Katan2 <-
add_rownames(Katan2, "JménaHráčů")# A tibble: 200 x 10
JménaHráčů Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<chr> <dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 LFIBC 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 DPYHT 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 IJOZT 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 KNPVD 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 WAXBF 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 UUHCH 6 15 muž ZŠ ne nepracuje nekouří člen 0
7 FDRSI 6 15 muž ZŠ ne nepracuje nekouří člen 0
8 ZHIRY 3 15 žena ZŠ ne nepracuje nekouří člen 0
9 YTCBV 3 15 žena ZŠ ne nepracuje nekouří člen 0
10 TEVNQ 9 15 žena ZŠ ne nepracuje nekouří nečlen 0
# ... with 190 more rows
Příklad 10
Vytvořte v rámci databáze Katan novou proměnnou Gambler, která bude rozdělovat hráče do čtyř skupin podle proměnné Partie na příležitostný hráč (jedna až dvě partie za měsíc), častý hráč (tři až čtyři partie za měsíc), deskový gambler (pět až šest partií za měsíc) a král osadníků (více jak sedm partií za měsíc).
Katan2 <-
mutate(Katan,
VěkSkupiny =
if_else(
Katan$Partie >= 0 &
Katan$Partie < 3, "příležitostný hráč",
if_else(
Katan$Partie >= 3 &
Katan$Partie < 5, "častý hráč",
if_else(
Katan$Partie >= 5 &
Katan$Partie < 7, "deskový gambler",
if_else(
Katan$Partie >= 7, "král osadníků", "NA")))))# A tibble: 200 x 10
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti VěkSkupiny
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl> <chr>
1 4 13 žena ZŠ ne neprac~ nekouří nečlen 0 častý hráč
2 4 13 žena ZŠ ne neprac~ nekouří nečlen 0 častý hráč
3 3 14 muž ZŠ ne neprac~ nekouří člen 0 častý hráč
4 8 14 muž ZŠ ne neprac~ nekouří nečlen 0 král osadní~
5 5 15 muž ZŠ ne neprac~ nekouří člen 0 deskový gam~
6 6 15 muž ZŠ ne neprac~ nekouří člen 0 deskový gam~
7 6 15 muž ZŠ ne neprac~ nekouří člen 0 deskový gam~
8 3 15 žena ZŠ ne neprac~ nekouří člen 0 častý hráč
9 3 15 žena ZŠ ne neprac~ nekouří člen 0 častý hráč
10 9 15 žena ZŠ ne neprac~ nekouří nečlen 0 král osadní~
# ... with 190 more rows
Příklad 11
Zjistěte, kolik unikátních kombinací počtu dětí a vzdělání obsahuje databáze Katan.
Kombinace <- distinct(Katan, Děti, Vzdělání)# A tibble: 12 x 2
Vzdělání Děti
<chr> <dbl>
1 ZŠ 0
2 SŠ 0
3 Bc - VŠ 0
4 VŠ 0
5 VŠ 1
6 SŠ 1
7 SŠ 2
8 VŠ 2
9 VŠ 4
10 SŠ 3
11 ZŠ 2
12 ZŠ 4
Příklad 12
Seřaďte databázi Katan podle proměnné Věk (vzestupně), následně Děti (sestupně) a na závěr podle proměnné Pohlaví.
Katan2 <-
arrange(Katan, Věk, desc(Děti), Pohlaví)# A tibble: 200 x 9
Partie Věk Pohlaví Vzdělání Kolej Práce Kouření Klub Děti
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
2 4 13 žena ZŠ ne nepracuje nekouří nečlen 0
3 3 14 muž ZŠ ne nepracuje nekouří člen 0
4 8 14 muž ZŠ ne nepracuje nekouří nečlen 0
5 5 15 muž ZŠ ne nepracuje nekouří člen 0
6 6 15 muž ZŠ ne nepracuje nekouří člen 0
7 6 15 muž ZŠ ne nepracuje nekouří člen 0
8 5 15 muž ZŠ ne nepracuje nekouří nečlen 0
9 3 15 žena ZŠ ne nepracuje nekouří člen 0
10 3 15 žena ZŠ ne nepracuje nekouří člen 0
# ... with 190 more rows
Příklad 13
Představte si, že máte dvě databáze, které chcete vzájemně propojit. První tabulka obsahuje známky z chemie, fyziky a číslo studenta ve třídním výkazu. Ta druhá zahrnuje jméno, příjmení a též číslo studenta (ID), které je pojítkem obou databází. Vaším cílem je spojit tyto databáze do jedné, jež bude obsahovat celkem pět sloupců (jméno, příjmení, ID, chemie a fyzika) v tomto pořadí.
data_01 <-
data.frame(
ID = c(23, 45, 50, 60, 70,
89, 40, 65, 44, 77),
chemie = c(2, 1, 2, 3, 4,
5, 3, 1, 2, 2),
fyzika = c(2, 1, 2, 4, 1,
5, 1, 1, 3, 1))
data_02 <-
data.frame(
ID = c(23, 45, 50, 60, 70,
89, 40, 65, 44, 77),
jméno = c("Petr", "Ondřej", "Jana",
"Eva", "David", "Franta",
"Filip", "Magda", "Bára",
"Jakub"),
příjmení = c("Všetečka", "Kubalík",
"Nováková", "Dvořáková",
"Svoboda", "Novotný",
"Černý", "Svobodová",
"Procházková", "Kučera"))
Data_známky <-
left_join(data_02, data_01, by = "ID")
# Chceme připojit tabulku data_01 k tabulce data_02,
# proto nejdříve zapíšeme název tabulky data_02, jejíž
# proměnné mají být nejdříve. ID jméno příjmení chemie fyzika
1 23 Petr Všetečka 2 2
2 45 Ondřej Kubalík 1 1
3 50 Jana Nováková 2 2
4 60 Eva Dvořáková 3 4
5 70 David Svoboda 4 1
6 89 Franta Novotný 5 5
7 40 Filip Černý 3 1
8 65 Magda Svobodová 1 1
9 44 Bára Procházková 2 3
10 77 Jakub Kučera 2 1